home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / Onboard / settings.py < prev    next >
Encoding:
Python Source  |  2009-10-12  |  7.8 KB  |  247 lines

  1. #!/usr/bin/python
  2. import gtk
  3. import gobject
  4.  
  5. from virtkey import virtkey
  6.  
  7. from Onboard.KeyboardSVG import KeyboardSVG
  8. from Onboard.SnippetList import SnippetList
  9. from Onboard.utils       import show_question_dialog
  10.  
  11. import Onboard.utils as utils
  12.  
  13. import shutil
  14.  
  15. from xml.parsers.expat import ExpatError
  16. from xml.dom import minidom
  17.  
  18. import os
  19. import os.path
  20. import gettext
  21.  
  22. ### Logging ###
  23. import logging
  24. _logger = logging.getLogger("Settings")
  25. ###############
  26.  
  27. ### Config Singleton ###
  28. from Onboard.Config import Config
  29. config = Config()
  30. ########################
  31.  
  32. from gettext import gettext as _
  33. #setup gettext
  34. app="onboard"
  35. gettext.textdomain(app)
  36. gettext.bindtextdomain(app)
  37.  
  38. ### Config Singleton ###
  39. from Onboard.Config import Config
  40. config = Config()
  41. ########################
  42.  
  43. class Settings:
  44.     def __init__(self,mainwin):
  45.  
  46.         # Do not run if running under GDM
  47.         if os.environ.has_key('RUNNING_UNDER_GDM'):
  48.             return
  49.  
  50.         builder = gtk.Builder()
  51.         builder.add_from_file(os.path.join(config.install_dir, "data", 
  52.             "settings.ui"))
  53.  
  54.         self.window = builder.get_object("settings_window")
  55.  
  56.         self.layout_view = builder.get_object("layout_view")
  57.  
  58.         self.layout_view.append_column(gtk.TreeViewColumn(None, gtk.CellRendererText(), markup = 0))
  59.  
  60.  
  61.         self.user_layout_root = "%s/.sok/layouts/" % os.path.expanduser("~")
  62.         if not os.path.exists(self.user_layout_root):
  63.             os.makedirs(self.user_layout_root)
  64.  
  65.         self.update_layoutList()
  66.  
  67.         self.icon_toggle = builder.get_object("icon_toggle")
  68.         self.icon_toggle.set_active(config.show_trayicon)
  69.         config.show_trayicon_notify_add(self.icon_toggle.set_active)
  70.  
  71.         self.start_minimized_toggle = builder.get_object(
  72.             "start_minimized_toggle")
  73.         self.start_minimized_toggle.set_active(config.start_minimized)
  74.         config.start_minimized_notify_add(
  75.             self.start_minimized_toggle.set_active)
  76.  
  77.         self.icon_palette_toggle = builder.get_object("icon_palette_toggle")
  78.         self.icon_palette_toggle.set_active(config.icp_in_use)
  79.         config.icp_in_use_change_notify_add(
  80.             self.icon_palette_toggle.set_active)
  81.  
  82.         # Snippets
  83.         self.snippet_list = SnippetList()
  84.         builder.get_object("snippet_scrolled_window").add(self.snippet_list)
  85.  
  86.         # Scanning
  87.         builder.get_object("scanning_check").set_active(config.scanning)
  88.  
  89.         builder.get_object("interval_spin").set_value(
  90.             config.scanning_interval/1000)
  91.  
  92.         self.window.show_all()
  93.  
  94.         self.window.set_keep_above(not mainwin)
  95.  
  96.         self.window.connect("destroy", gtk.main_quit)
  97.         builder.connect_signals(self)
  98.  
  99.         _logger.info("Entering mainloop of onboard-settings")
  100.         gtk.main()
  101.  
  102.     def on_snippet_add_button_clicked(self, event):
  103.         _logger.info("Snippet add button clicked")
  104.         snippet_text = show_question_dialog(_("Enter text for snippet"))
  105.         if snippet_text != None: self.snippet_list.append(snippet_text)
  106.  
  107.     def on_snippet_remove_button_clicked(self, event):
  108.         _logger.info("Snippet remove button clicked")
  109.         self.snippet_list.remove_selected()
  110.  
  111.     def on_icon_toggled(self,widget):
  112.         config.show_trayicon = widget.get_active()
  113.  
  114.     def on_start_minimized_toggled(self,widget):
  115.         config.start_minimized = widget.get_active()
  116.  
  117.     def on_icon_palette_toggled(self, widget):
  118.         config.icp_in_use = widget.get_active()
  119.  
  120.     def open_user_layout_dir(self):
  121.         if os.path.exists('/usr/bin/nautilus'):
  122.             os.system(("nautilus --no-desktop %s" %self.user_layout_root))
  123.         elif os.path.exists('/usr/bin/thunar'):
  124.             os.system(("thunar %s" %self.user_layout_root))
  125.         else:
  126.             print _("No file manager to open layout folder")
  127.  
  128.     def on_layout_folder_button_clicked(self, widget):
  129.         self.open_user_layout_dir()
  130.  
  131.     def on_personalise_button_clicked(self, widget):
  132.         new_layout_name = show_question_dialog(
  133.             _("Enter name for personalised layout"))
  134.         if layout_name:
  135.             keyboard = KeyboardSVG(config.layout_filename)
  136.             utils.create_layout_XML(new_layout_name, virtkey(), keyboard)
  137.             self.update_layoutList()
  138.             self.open_user_layout_dir()
  139.  
  140.     def on_scanning_check_toggled(self, widget):
  141.         config.scanning = widget.get_active()
  142.  
  143.     def on_interval_spin_value_changed(self, widget):
  144.         config.scanning_interval = int(widget.get_value()*1000)
  145.  
  146.     def on_close_button_clicked(self, widget):
  147.         self.window.destroy()
  148.         gtk.main_quit()
  149.  
  150.     def update_layoutList(self):
  151.         self.layoutList = gtk.ListStore(str,str)
  152.         self.layout_view.set_model(self.layoutList)
  153.  
  154.         self.get_soks(os.path.join(config.install_dir, "layouts"))
  155.         self.get_soks(self.user_layout_root)
  156.  
  157.     def cb_selected_layout_changed(self):
  158.         self.get_soks(self.user_layout_root)
  159.  
  160.     def on_add_button_clicked(self, event):#todo filtering
  161.         chooser = gtk.FileChooserDialog(title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN,
  162.                                       buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
  163.         filterer = gtk.FileFilter()
  164.         filterer.add_pattern("*.sok")
  165.         chooser.add_filter(filterer)
  166.         response = chooser.run()
  167.         if response == gtk.RESPONSE_OK:
  168.             filename = chooser.get_filename()
  169.  
  170.  
  171.             f = open(filename)
  172.             sokdoc = minidom.parse(f).documentElement
  173.             for p in sokdoc.getElementsByTagName("pane"):
  174.                 fn = p.attributes['filename'].value
  175.  
  176.                 shutil.copyfile("%s/%s" % (os.path.dirname(filename), fn), "%s%s" % (self.user_layout_root, fn))
  177.  
  178.  
  179.             shutil.copyfile(filename,"%s%s" % (self.user_layout_root, os.path.basename(filename)))
  180.  
  181.             self.update_layoutList()
  182.         chooser.destroy()
  183.  
  184.  
  185.     def on_remove_button_clicked(self, event):
  186.         filename = self.layoutList.get_value(self.layout_view.get_selection().get_selected()[1],1)
  187.  
  188.         f = open(filename)
  189.         sokdoc = minidom.parse(f).documentElement
  190.         f.close()
  191.  
  192.         os.remove(filename)
  193.  
  194.         for p in sokdoc.getElementsByTagName("pane"):
  195.             os.remove("%s/%s" % (os.path.dirname(filename), p.attributes['filename'].value))#todo get sok to deal with not having a layout.
  196.         config.layout_filename = ""
  197.         self.update_layoutList()
  198.  
  199.  
  200.  
  201.     def get_soks(self, path):
  202.  
  203.         files = os.listdir(path)
  204.  
  205.         soks = []
  206.         for f in files:
  207.             if f[-4:] == ".sok":
  208.                 filename = "%s/%s" % (path,f)
  209.                 file_object = open(filename)
  210.                 try:
  211.                     sokdoc = minidom.parse(file_object).documentElement
  212.  
  213.                     value = sokdoc.attributes["id"].value
  214.                     if os.access(filename,os.W_OK):
  215.                         soks.append((value.lower(), "<i>%s</i>" % value, filename))
  216.                     else:
  217.                         soks.append((value.lower(), value, filename))
  218.  
  219.                 except ExpatError,(strerror):
  220.                     print "XML in %s %s" % (filename, strerror)
  221.                 except KeyError,(strerror):
  222.                     print "key %s required in %s" % (strerror,filename)
  223.  
  224.                 file_object.close()
  225.  
  226.         for key, value, filename in sorted(soks):
  227.             it = self.layoutList.append((value, filename))
  228.             if filename == config.layout_filename:
  229.                 self.layout_view.get_selection().select_iter(it)
  230.             
  231.  
  232.     def find_soks(self, path):
  233.         files = os.listdir(path)
  234.         soks = []
  235.         for f in files:
  236.             if f[-4:] == ".sok":
  237.                 soks.append(f)
  238.         return soks
  239.  
  240.     def on_layout_view_released(self, widget, event):
  241.         config.layout_filename = self.layoutList.get_value(
  242.                 widget.get_selection().get_selected()[1],1)
  243.  
  244.  
  245. if __name__=='__main__':
  246.     s = Settings(True)
  247.